package ManageSystem;
// 普通员工子类：继承Employee，实现普通员工的薪资计算和工资条生成
public class RegularEmployee extends Employee {
    // 普通员工特有属性：时薪、当月工作时长
    private double hourlyRate;
    private double workHours;

    // 构造方法：初始化父类公共属性 + 子类特有属性
    public RegularEmployee(String name, String empId, double hourlyRate, double workHours) {
        super(name, empId); // 调用父类构造方法初始化姓名、工号
        this.hourlyRate = hourlyRate;
        this.workHours = workHours;
    }

    // 实现父类的“计算薪资”方法：按“时薪×工作时长”计算，同时校验时长合法性
    @Override
    public double calculateSalary() throws InvalidWorkHoursException {
        // 异常校验：工作时长不能为负，且每月不超过720小时（30天×24小时）
        if (workHours < 0 || workHours > 720) {
            // 抛出自定义异常，提示非法时长
            throw new InvalidWorkHoursException("工作时长异常：" + workHours + "小时（合法范围：0~720）");
        }
        return hourlyRate * workHours; // 合法时计算薪资
    }

    // 实现父类的“生成工资条”方法：拼接普通员工的工资条信息
    @Override
    public String generatePaySlip() {
        try {
            double salary = calculateSalary(); // 调用自身的薪资计算方法
            // 用String拼接工资条格式
            return "=== 工资条 ===\n" +
                    "员工类型：普通员工\n" +
                    "姓名：" + super.getName() + "\n" + // 调用父类的getName()获取姓名
                    "工号：" + super.getEmpId() + "\n" +
                    "时薪：" + hourlyRate + "元/小时\n" +
                    "工作时长：" + workHours + "小时\n" +
                    "本月薪资：" + salary + "元\n" +
                    "=============";
        } catch (InvalidWorkHoursException e) {
            // 捕获薪资计算时的异常，生成失败提示
            return "=== 工资条生成失败 ===\n" +
                    "员工：" + super.getName() + "（" + super.getEmpId() + "）\n" +
                    "原因：" + e.getMessage() + "\n" +
                    "=====================";
        }
    }
    // Getter/Setter：提供子类特有属性的访问和修改入口
    public double getHourlyRate() {
        return hourlyRate;
    }

    public void setHourlyRate(double hourlyRate) {
        this.hourlyRate = hourlyRate;
    }

    public double getWorkHours() {
        return workHours;
    }

    public void setWorkHours(double workHours) {
        this.workHours = workHours;
    }
}